package com.zy.core.data.jpa.support.repository;

import com.zy.core.data.jpa.support.entity.BaseEntity;
import com.zy.core.data.jpa.support.entity.page.Pagination;
import com.zy.core.util.Finder;
import com.zy.core.util.Updater;
import org.hibernate.Session;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Optional;

@NoRepositoryBean
public interface BaseRepository<T extends BaseEntity, ID extends Serializable>
        extends JpaRepository<T, ID> {


    /**
     * 获取hibernate的session,方便我们操作自己的hql
     * @return
     */
    Session getSession();

    /**
     *
     * @param id
     * @return
     */
    T findOne(ID id);

    /**
     * 根据查找器返回一个list
     * @param finder
     * @return
     */
    List findListByFinder(Finder finder);

    T updateByUpdater(Updater<T> updater);

    /**
     * 根据查找器及分页参数返回分页对象
     * @param finder 查找器
     * @param pageNo 页码
     * @param pageSize 每页数据量
     * @return
     */
    Pagination findPageByFinder(Finder finder, int pageNo, int pageSize);

    /**
     *
     * @param finder
     * @return
     */
    List findObjectListByFinder(Finder finder);

    /**
     *  获取Map类型结果集
     * @param finder
     * @return
     */
    List<Map<String,Object>> findMapByFinder(Finder finder);

    /**
     *  获取数组类型结果集
     * @param finder
     * @return
     */
    List<Object[]> findObjectArrayListByFinder(Finder finder);

    /**
     *  获取查询数量结果集
     * @param finder
     * @return
     */
    int countQueryResult(Finder finder);

    /**
     *
     * @param sql
     * @return
     */
    Double getAvgQueryResult(String sql);

    /**
     *
     * @param hql
     * @param values
     * @return
     */
    @SuppressWarnings("unchecked")
    List find(String hql, Object... values);

    /**
     * 确定值返回一个实例
     * @param hql
     * @param values
     * @return
     */
    Object findUnique(String hql, Object... values);


}
